/*
* Arquivo.java
*
* Copyright 2011 Monica S. Cavalcante.
* All rights reserved.
*
* This file is part of Mandatory Arrest
*
* MandatoryArrest is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* MandatoryArrest is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with MandatoryArrest. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* Isabella Pessoa isabella.agp at gmail.com
* Michell Jacks michelljacks at gmail.com
* Monica Santana monicaasc.cc at gmail.com
*/

package br.edu.ufcg.dsc.lp2.projeto.model;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import br.edu.ufcg.dsc.lp2.projeto.model.exceptions.ArquivoInvalidoException;
import br.edu.ufcg.dsc.lp2.projeto.model.exceptions.CaminhoInvalidoException;

/**
 * 
 * @author Monica Santana monicaasc.cc at gmail.com
 *
 */
public class Arquivo {
	
	/**
	 * Um arquivo.
	 * @param endereco Uma string referente ao endereco do arquivo.
	 */
	public Arquivo(String caminho) {
		if (caminho == null || caminho.equals("")) {
			throw new CaminhoInvalidoException("Caminho invalido");
		}
		
		this.caminho = caminho;
	}
	
	/**
	 * Retona o endereco de um Arquivo.
	 * @return String com o endereco de um arquivo.
	 */
	public static String getCaminho() {
		return caminho;
	}
	
	/**
	 * Modifica o endereco de um Arquivo.
	 * @param endereco String com o novo endereco do arquivo.
	 */
	public void setCaminho(String caminho) {
		this.caminho = caminho;
	}
	
	/**
	 * Faz a leitura do arquivo e retorna em uma lista.
	 * @return ArrayList de Strings com os dados do arquivo. 
	 */
	public static List<String> ler() {
		List<String> linhas = new ArrayList<String>();
		try {  
			BufferedReader leitor = new BufferedReader(new FileReader(getCaminho()));
            String str;
            while (leitor.ready()) {
                str = leitor.readLine();
                linhas.add(str);
            }

            leitor.close();
		} catch (Exception e) {
			throw new ArquivoInvalidoException("Arquivo invalido");
		}
		return linhas;
	}
	
	/**
	 * Adiciona uma String ao final do arquivo.
	 * @param conteudo String a ser adicionada ao arquivo.
	 */
	public static void adicionar(Usuario usuario) {
		String dados = juntaInfor(usuario);
		
		try {
			FileWriter fw = new FileWriter(getCaminho(), true);

			fw.write(dados);
			fw.close();
		} catch (Exception e) {
			System.err.println("Erro: Arquivo invalido!" );
		}
	}
	
	
	/**
	 * Junta todas as informacoes a serem salvas no arquivo.
	 * @param usuario Um usuario.
	 * @return Todos os dados separados por ";".
	 */
	private static String juntaInfor(Usuario usuario) {
		final String fimDeLinha = System.getProperty("line.separator");
		List<Integer> notas = usuario.listaDeOpinioes();
		String dados = (new SimpleDateFormat("dd/MM/yyyy HH:mm")).format(new Date())
						+ ";" + usuario.getNome() + ";";
		
		for (int i = 0; i < notas.size(); i++) {
			dados += i == notas.size() -1 ? // Verifica se e o ultimo indice, se for
											// nao adiciona o ';'.
					adicionaNota(notas.get(i)) + fimDeLinha : adicionaNota(notas.get(i))+";";
		}
		return dados;
	}
	
	/**
	 * Adiciona comentario a nota.
	 * @param num Valor da nota.
	 * @return Nota e comentarios da nota.
	 */
	private static String adicionaNota(int num) {
		switch(num) {
		case 5:
			return "5: Incrível. sensacional. impressionante";
		case 4:
			return "4: Muito bom";
		case 3:
			return "3: Bastante bom";
		case 2:
			return "2 : É bonzinho";
		case 1:
			return "1 : Não é ruim";
		case 0:
			return "0 : Não conheço";
		case -1:
			return "-1: Acho um pouco ruim";
		case -2:
			return "-1: Acho ruim";
		case -3:
			return "-3: Acho bastante ruim";
		case -4:
			return "-4: Acho muito ruim";
		case -5:
			return "-5: Detesto";
		}
		return null;

	}
	
	/**
	 * Endereco do arquivo.
	 */
	private static String caminho;
	
}